package com.zyf.chapter02.behavior.chain.framework.spring;

import java.util.ArrayList;
import java.util.List;

/**
 * 仿照 Spring 的实现方式 <p/>
 * 优点：是 spring 框架内部实现，并没有使用递归，实现相对于 servlet 更加灵活
 * @author yifeng
 */
public class HandlerExecutionChain {
    private List<IHandler> handlers = new ArrayList<>();
    // 记录执行执行器的位置
    private int index = -1;

    public void addHandler(IHandler handler) {
        this.handlers.add(handler);
    }

    /**
     * 链中的所有处理器都要执行
     */
    public boolean applyPreHandle() {
        for (IHandler handler : handlers) {
            boolean result = handler.preHandler();
            index++;
            // 如果执行失败，会主动调用 afterCompletion，不需要用户手动调用这个方法了
            if (!result) {
                triggerAfterCompletion();
                return false;
            }
        }
        return true;
    }

    public void applyPostHandle(boolean result) {
        for (int i = index; i >= 0; i--) {
            handlers.get(i).postHandler(result);
        }
    }

    public void triggerAfterCompletion() {
        for (int i = index; i >= 0; i--) {
            handlers.get(i).triggerAfterCompletion();
        }
    }
}
